from app.extensions import db
from datetime import datetime


class BaseModel(db.Model):
    __abstract__=True # 作为抽象类，不能单独作为模型出现，只能作父类
    id=db.Column(db.Integer,primary_key=True,autoincrement=True)
    timestamp=db.Column(db.DateTime,default=datetime.utcnow)


class NewsType(BaseModel):
    __tablename__='news_type' # 不写这句和父类中的__abstract__，生成的表名是base_model
    type=db.Column(db.String(50),nullable=False)


class News(BaseModel):
    __tablename__='news'
    title=db.Column(db.String(100),nullable=False)
    content=db.Column(db.Text,nullable=False)
    type_id=db.Column(db.Integer,db.ForeignKey('news_type.id'))
    user_id=db.Column(db.Integer, db.ForeignKey('user.id'))
    is_deleted=db.Column(db.Boolean,default=False)
    comments=db.relationship('NewsComment',backref='news')


class NewsComment(BaseModel):
    __tablename__='news_comment'
    content=db.Column(db.String(256),nullable=False)
    star_times=db.Column(db.Integer,default=0) # 点赞量
    news_id=db.Column(db.Integer,db.ForeignKey('news.id')) # 被评论的新闻的id
    user_id=db.Column(db.Integer,db.ForeignKey('user.id')) # 发表评论的人的id
    replies=db.relationship('Reply',backref='comment')


class User(BaseModel):
    __tablename__='user'
    username=db.Column(db.String(50),unique=True,nullable=True)
    password=db.Column(db.String(128)) # 短信登录时，若当前手机号未注册，则自动注册。这时由于是短信登录，所以没有密码，所以创建用户时可以没有密码
    phone=db.Column(db.String(11),unique=True,nullable=True)
    portrait_file_name=db.Column(db.String(64))
    is_deleted=db.Column(db.Boolean,default=False)
    news=db.relationship('News',backref='author') # 根据新闻查作者
    comments=db.relationship('NewsComment',backref='user')
    replies=db.relationship('Reply',backref='user')


class Reply(BaseModel): # 对评论的回复
    __tablename__='reply'
    content=db.Column(db.String(256),nullable=False)
    star_times=db.Column(db.Integer,default=0) # 点赞量
    comment_id=db.Column(db.Integer,db.ForeignKey('news_comment.id')) # 被回复的评论的id
    user_id=db.Column(db.Integer,db.ForeignKey('user.id')) # 发表回复的人的id